/**
 * @project_name thread
 * @package_name com.gxwz.thread
 * @file_name Simple4Semaphore.java
 */
package com.gxwz.thread;

import java.util.concurrent.Semaphore;

/**
 * 有三个线程分别是A，B，C；每个线程只能打印自己的名字，
 * 在屏幕上顺序打印ABC，打印10次。不准使用sleep函数
 * @author chendequan
 * @email 1527254027@qq.com
 * @datetime 2013-9-6 下午01:46:46
 * 
 */
public class Simple4Semaphore extends Thread {

	private Semaphore current;
	private Semaphore next;
	
	/**
	 * @param current
	 * @param next
	 */
	public Simple4Semaphore(String name, Semaphore current, Semaphore next) {
		super(name);
		this.current = current;
		this.next = next;
	}
	
	/* (non-Javadoc)
	 * @see java.lang.Thread#run()
	 */
	public void run() {
		for (int i = 0; i < 10; i++) {
			try {
//				从此信号量获取一个许可，在提供一个许可前一直将线程阻塞，否则线程被中断。 
//				类似于wait函数
				current.acquire();
			} catch (Exception e) {
				e.printStackTrace();
			}
			
			System.out.print(this.getName());
//			类似于notify函数
			next.release();
		}
	}

	/**
	 * @datetime 2013-9-6 下午01:46:46
	 * @param args
	 */
	public static void main(String[] args) {
//		用参数可以指定先打印那个字符；a为1就先打印A，b为1先打印B；
		Semaphore a = new Semaphore(1);
		Semaphore b = new Semaphore(0);
		Semaphore c = new Semaphore(0);
		
//		启动三个线程
		new Simple4Semaphore("A", a, b).start();
		new Simple4Semaphore("B", b, c).start();
		new Simple4Semaphore("C", c, a).start();
	}

}
